home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue35 / eval_dan / EVAL_DAN.ZIP / mathtest.pas < prev    next >
Pascal/Delphi Source File  |  1997-12-30  |  4KB  |  154 lines

  1. unit mathtest;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   mathcomp, StdCtrls, ComCtrls, Tabnotbk;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     EDT_Expression: TEdit;
  12.     BTN_MakeTree: TButton;
  13.     TreeView: TTreeView;
  14.     BTN_Evaluate: TButton;
  15.     LBL_Value: TLabel;
  16.     Notebook: TTabbedNotebook;
  17.     MEMO_Tokens: TMemo;
  18.     LB_Vars: TListBox;
  19.     Label1: TLabel;
  20.     EDT_VarName: TEdit;
  21.     Label2: TLabel;
  22.     EDT_VarData: TEdit;
  23.     BTN_Set: TButton;
  24.     BTN_Delete: TButton;
  25.     BTN_Clear: TButton;
  26.     Label3: TLabel;
  27.     procedure FormCreate(Sender: TObject);
  28.     procedure FormDestroy(Sender: TObject);
  29.     procedure BTN_MakeTreeClick(Sender: TObject);
  30.     procedure BTN_EvaluateClick(Sender: TObject);
  31.     procedure BTN_SetClick(Sender: TObject);
  32.     procedure BTN_DeleteClick(Sender: TObject);
  33.     procedure BTN_ClearClick(Sender: TObject);
  34.   private
  35.     { Private declarations }
  36.   public
  37.     { Public declarations }
  38.     procedure UpdateVarsLB;
  39.   end;
  40.  
  41. var
  42.   Form1: TForm1;
  43.   Tree: TExpressionTree;
  44.  
  45. implementation
  46.  
  47. {$R *.DFM}
  48.  
  49. procedure TForm1.UpdateVarsLB;
  50. var
  51. i: longint;
  52. PVar: PVariableRecord;
  53. begin
  54.   if Tree.VarList.Count > 0 then
  55.   begin
  56.     LB_Vars.Clear;
  57.     for i := 0 to Tree.Varlist.count-1 do
  58.     begin
  59.       PVar := PVariableRecord(Tree.VarList.Items[i]);
  60.       LB_Vars.Items.Add(PVar^.VarName+': '+FloatToStr(PVar^.VarData));
  61.     end;
  62.   end;
  63. end;
  64.  
  65. procedure TForm1.FormCreate(Sender: TObject);
  66. begin
  67.   Tree := TExpressionTree.Create;
  68.   Tree.VarList := TVarList.Create;
  69. end;
  70.  
  71. procedure TForm1.FormDestroy(Sender: TObject);
  72. begin
  73.   Tree.VarList.Free;
  74.   Tree.Free;
  75. end;
  76.  
  77. procedure TForm1.BTN_MakeTreeClick(Sender: TObject);
  78.  
  79. procedure DoTree(CNode: TExpressionNode; ONode: TTreeNode);
  80. var
  81. i: longint;
  82. begin
  83.   ONode := TreeView.Items.AddChild(ONode,CNode.Value);
  84.   if CNode.Children.Count>0 then
  85.   begin
  86.     for i := 0 to CNode.Children.Count-1 do
  87.       DoTree(TExpressionNode(CNode.Children.items[i]),ONode);
  88.   end;
  89. end;
  90.  
  91. begin
  92.   Tree.Expression := EDT_Expression.Text;
  93.   MEMO_Tokens.Lines.Assign(Tree.Tokens);
  94.   if Assigned(Tree.TopNode) then
  95.   begin
  96.     TreeView.Items.Clear;
  97.     DoTree(Tree.TopNode,TreeView.Selected);
  98.     TreeView.FullExpand;
  99.   end;
  100.   BTN_Evaluate.Enabled := True;
  101. end;
  102.  
  103. procedure TForm1.BTN_EvaluateClick(Sender: TObject);
  104. begin
  105.   if Assigned(Tree.TopNode) then
  106.   begin
  107.     Tree.TopNode.Evaluate(False,True);
  108.     LBL_Value.Caption := FloatToStr(Tree.TopNode.NumValue);
  109.     if not Tree.TopNode.ValidValue then
  110.       LBL_Value.Caption := LBL_Value.Caption + ' [Not valid]';
  111.     UpdateVarsLB;
  112.   end;
  113. end;
  114.  
  115. procedure TForm1.BTN_SetClick(Sender: TObject);
  116. var
  117. tf: double;
  118. begin
  119.   if EDT_VarName.Text<> '' then
  120.   begin
  121.     try
  122.       tf := StrToFloat(EDT_VarData.Text);
  123.       //It worked--create new variable and update
  124.       Tree.VarList.NewVar(EDT_VarName.Text,tf);
  125.       UpdateVarsLB;
  126.     except
  127.       on EConvertError do
  128.       begin
  129.         ShowMessage(EDT_VarData.Text+' is not a valid numeric value.');
  130.         Exit;
  131.       end;
  132.     end;
  133.   end;
  134. end;
  135.  
  136. procedure TForm1.BTN_DeleteClick(Sender: TObject);
  137. begin
  138.   if (LB_Vars.ItemIndex > -1) and (Tree.VarList.Count>0) then
  139.   begin
  140.     Dispose(PVariableRecord(Tree.VarList.items[LB_Vars.ItemIndex]));
  141.     Tree.VarList.Delete(LB_Vars.ItemIndex);
  142.     UpdateVarsLB;
  143.   end;
  144. end;
  145.  
  146. procedure TForm1.BTN_ClearClick(Sender: TObject);
  147. begin
  148.   Tree.VarList.Free;
  149.   Tree.VarList := TVarList.Create;
  150.   LB_Vars.Clear;
  151. end;
  152.  
  153. end.
  154.